package com.huang.auth.entity.vo;

import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Objects;
import java.util.Set;

/**
 * @author HuangShen
 * @Description 动态路由
 * <p>
 * {
 * "name": "Demo", //首字母大写，一定要与vue文件的name对应起来，name名不可重复，用于noKeepAlive缓存控制（该项特别重要）
 * "path": "/", //注意根路由（第一条数据）是斜线，第一级路由必须带斜线，第二级路由开始不能，path名不可重复
 * "component": "Layout", //后端路由时此项为字符串，前端路由时此项为import的function，第一级路由是为Layout，其余为层级为vue的文件路径
 * "redirect":"" //重定向到子路由，格式从第一级路由开始拼接
 * "meta": {
 * },
 * "children": []
 * }
 * @create 2021-11-06 17:09
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class RoutesVO implements Comparable<RoutesVO> {


    private String path;
    private String name;
    private String component;
    private String redirect;
    private RouteMeta meta;
    @JsonIgnore //用于排序不进行序列化
    private Integer sortValue;
    private Set<RoutesVO> children;

    @Override
    public int compareTo(RoutesVO o) {
        int sort = this.sortValue.compareTo(o.sortValue);
        if(sort==0){
            return 1;
        }
        return sort;
    }


    /**
     * "hidden": true, //2021年5月23日后新版用法：是否显示在菜单中显示隐藏路由（默认值：false）
     * "levelHidden": false, //2021年5月23日后新版用法：是否显示在菜单中显示隐藏一级路由（默认值：true）
     * "title": "title", //菜单、面包屑、多标签页显示的名称
     * "guard": ["Admin", "..."], //当config/settings.js中rolesControl配置开启时，用于控制角色（简写）
     * "icon": "", //新版
     * "isCustomSvg": false, //新版，是否是自定义svg图标（默认值：false，如果设置true，那么需要把你的svg拷贝到icon下，然后icon字段配置上你的图标名）
     * "noKeepAlive": true, //当前路由是否不缓存（默认值：false）
     * "noClosable": true, //当前路由是否可关闭多标签页，同上（新版）
     * "noColunm":false, //是否隐藏分栏，仅在分栏布局中二级路由生效（默认值：false）
     * "badge": "New", //badge小标签（只支持子级）
     * "tabHidden": true, //当前路由是否不显示多标签页
     * "target": "_blank", //是否浏览新标签页打开（不适用于分栏布局左侧tab部分）
     * "activeMenu": "", //高亮指定菜单，要从跟路由的path开始拼接
     * "dot": false, //小圆点
     * "dynamicNewTab": false, //动态传参路由是否新开标签页
     * "breadcrumbHidden": true //面包屑是否显示，默认为true
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class RouteMeta {
        private Boolean hidden = false;
        private Boolean levelHidden = true;
        private String title;
        private String icon;
        private Boolean isCustomSvg = false;
        private Boolean noKeepAlive = true;
        private Boolean noClosable = false;
        private String badge;
        private Boolean dot = false;
        private Boolean dynamicNewTab = false;
        private Boolean breadcrumbHidden = true;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        RoutesVO routesVO = (RoutesVO) o;
        return Objects.equals(name, routesVO.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name);
    }
}
